var StringUtils = function () {
    return this;
};
StringUtils.prototype = {
    constructor: StringUtils,

    /**
     * 是否为空字符串。
     * @param str 待判断的字符串.
     * @param badString 是否要判断定字符串值是undefined/null的为空.
     * @returns {boolean}
     */
    isBlank: function (str, badString) {
        if(str == undefined || str == null || str == '' || str.length < 1){
            return true;
        } else {
            if (badString) {
                if (s == 'undefined' || str == 'null') {
                    return true;
                }
            }
        }
        return false;
    },
    /**
     * UUID.
     * @returns {string}
     */
    guid: function() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0,
                v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    },
    /**
     * 是否为手机号.
     * @param str 需要判断的字符串.
     * @returns {boolean}
     */
    isMobile: function (str) {
        if (this.isBlank(str)) {
            return false;
        }
        return /^(0|"+")?((1)\d{10})$/.test(str);
    },

    /**
     * 是否为数字.
     * @param value
     * @returns {boolean|boolean}
     */
    isNumber: function (value) {
        return /^[0-9]+.?[0-9]*/.test(value);
    },

    /**
     * 是否为英文或数字.
     * @param str
     * @returns {boolean}
     */
    isEnNumber: function (str) {
        if (this.isBlank(str)) {
            return false;
        }
        return /^[0-9a-zA-Z]*$/g.test(str);
    },

    /**
     * 是否为邮箱地址.
     * @param str
     * @returns {boolean}
     */
    isEmail: function (str) {
        return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(str);
    },

    /**
     * 生成随机字符串
     * @param len 长度
     * @param char 样本
     * @returns {string}
     */
    getRandomString: function (len, char) {
        len = len || 32;
        // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1
        char = char || 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
        let maxPos = char.length;
        let str = '';
        for (let i = 0; i < len; i++) {
            str += char.charAt(Math.floor(Math.random() * maxPos));
        }
        return str;
    },

    /**
     * 是否为IP地址.
     * @param strIP
     * @returns {boolean}
     */
    isIpv4: function (strIP) {
        if (this.isBlank(strIP)) {
            return false;
        }
        if(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g.test(strIP)){
            if( RegExp.$1 <256 && RegExp.$2<256 && RegExp.$3<256 && RegExp.$4<256) {
                return true;
            }
        }
        return false;
    },

    /**
     * 是否为IPV6地址.
     * @param str
     * @returns {*}
     * 参考：https://www.jb51.net/article/86335.htm
     */
    isIpv6: function (str) {
        return /:/.test(str)
        &&str.match(/:/g).length<8
        &&/::/.test(str)
            ?(str.match(/::/g).length==1
                &&/^::$|^(::)?([\da-f]{1,4}(:|::))*[\da-f]{1,4}(:|::)?$/i.test(str))
            :/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str);
    },
    /**
     * 是否为英文域名
     * @param value
     * @returns {boolean}
     */
    isEnDomain: function (value) {
        if (value.indexOf("--")!= -1) {
            return false;
        }
        if (value.indexOf("-\.")!= -1) {
            return false;
        }
        if (value.indexOf("\.-")!= -1) {
            return false;
        }
        var reg = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][a-zA-Z0-9]{0,62})+$/;
        return reg.test(value);
    },

    /**
     * 是否为二级英文域名.
     * @param value
     * @returns {boolean}
     */
    isSecondEnDomain: function (value) {
        var pattern = /^(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/i;
        return pattern.test(value);
    },

    /**
     * 是否为中文域名.
     * @param value
     * @returns {boolean}
     */
    isCnDomain: function (value) {
        var pattern = /^[A-Za-z0-9_\u4E00-\u9FA5]+([\.\-][A-Za-z0-9_\u4E00-\u9FA5]+)*$/;
        return pattern.test(value);
    },

    /**
     * 是否为域名.
     * @param value
     * @returns {boolean}
     */
    isDomain: function (value) {
        if (this.isEnDomain(value)) {
            return true;
        }
        if (this.isSecondEnDomain(value)) {
            return true;
        }
        if (this.isCnDomain(value)) {
            return true;
        }
        return false;
    },

    /**
     * 是否为SRV记录值.
     * @param str
     */
    isSRV: function (str) {
        if (this.isBlank(str)) {
            return false;
        }
        if (str.indexOf(':') === -1) {
            return false;
        }
        var arrStr = str.split(':');
        if (!this.isDomain(arrStr[0])) {
            return false;
        }
        if (this.isBlank(arrStr[1]) || !this.isNumber(arrStr[1])) {
            return false;
        }
        if (arrStr[1].length < 1 || arrStr[1].length > 5) {
            return false;
        }
        return true;
    },

    /**
     * 是否以match为开始.
     * @param str
     * @param match
     * @returns {boolean}
     */
    startsWith: function (str, match) {
        return str.substr(0, match.length) === match;
    },

    /**
     * 是否以match为结束.
     * @param str
     * @param match
     * @returns {boolean}
     */
    endsWith: function (str, match) {
        return str.substr(str.length - match.length) === match;
    }
};
window.QiStringUtils = new StringUtils();
